<?php
class aliPay
{
    var $gateway;			//网关地址
    var $_key;				//安全校验码
    var $mysign;			//签名结果
    var $sign_type;			//签名类型
    var $parameter;			//需要签名的参数数组
    var $_input_charset;    //字符编码格式

    /**构造函数
	*从配置文件及入口文件中初始化变量
	*$parameter 需要签名的参数数组
	*$key 安全校验码
	*$sign_type 签名类型
    */
    function  __construct($parameter,$key,$sign_type) {
        $this->gateway	  = "https://www.alipay.com/cooperate/gateway.do?";
        $this->_key       = $key;
        $this->sign_type  = $sign_type;
        $this->parameter  = $this->para_filter($parameter);

        //设定_input_charset的值,为空值的情况下默认为GBK
        if($parameter['_input_charset'] == '')
            $this->parameter['_input_charset'] = 'UTF-8';
        $this->_input_charset   = $this->parameter['_input_charset'];
        //获得签名结果
        $sort_array   = $this->arg_sort($this->parameter);    //得到从字母a到z排序后的签名参数数组
        $this->mysign = $this->build_mysign($sort_array,$this->_key,$this->sign_type);
    }

    /********************************************************************************/

    function return_sign(){
      return $this->mysign;
    }
    /**构造表单提交HTML
	*return 表单提交HTML文本
     */
    function build_form() {
		//GET方式传递
        $sHtml = "<div align='center'><form id='alipaysubmit' name='alipaysubmit' action='".$this->gateway."_input_charset=".$this->parameter['_input_charset']."' method='get'>";
		//POST方式传递（GET与POST二必选一）
		//$sHtml = "<form id='alipaysubmit' name='alipaysubmit' action='".$this->gateway."_input_charset=".$this->parameter['_input_charset']."' method='post'>";

        while (list ($key, $val) = each ($this->parameter)) {
            $sHtml.= "<input type='hidden' name='".$key."' value='".$val."'/>";
        }

        $sHtml = $sHtml."<input type='hidden' name='sign' value='".$this->mysign."'/>";
        $sHtml = $sHtml."<input type='hidden' name='sign_type' value='".$this->sign_type."'/>";

		//submit按钮控件请不要含有name属性
        $sHtml = $sHtml."<input type='submit' value='正在转到支付宝...'></form></div>";
		
		$sHtml = $sHtml."<script>document.forms['alipaysubmit'].submit();</script>";
		
        return $sHtml;
    }
    /********************************************************************************/
   /*********************************将公共函数写入aliPay类************************************/
   /*********************************将公共函数写入aliPay类************************************/
   /*********************************将公共函数写入aliPay类************************************/
   /*********************************将公共函数写入aliPay类************************************/
    function build_mysign($sort_array,$key,$sign_type = "MD5") {
        $prestr = $this->create_linkstring($sort_array);     	//把数组所有元素，按照“参数=参数值”的模式用“&”字符拼接成字符串
        $prestr = $prestr.$key;							//把拼接后的字符串再与安全校验码直接连接起来
        $mysgin = $this->sign($prestr,$sign_type);			    //把最终的字符串签名，获得签名结果
        return $mysgin;
    }	

    /********************************************************************************/

    /**把数组所有元素，按照“参数=参数值”的模式用“&”字符拼接成字符串
      *$array 需要拼接的数组
      *return 拼接完成以后的字符串
    */
    function create_linkstring($array) {
        $arg  = "";
        while (list ($key, $val) = each ($array)) {
            $arg.=$key."=".$val."&";
        }
        $arg = substr($arg,0,count($arg)-2);		     //去掉最后一个&字符
        return $arg;
    }

    /********************************************************************************/

    /**除去数组中的空值和签名参数
      *$parameter 签名参数组
      *return 去掉空值与签名参数后的新签名参数组
     */
    function para_filter($parameter) {
        $para = array();
        while (list ($key, $val) = each ($parameter)) {
            if($key == "sign" || $key == "sign_type" || $val == "")continue;
            else	$para[$key] = $parameter[$key];
        }
        return $para;
    }

    /********************************************************************************/

    /**对数组排序
      *$array 排序前的数组
      *return 排序后的数组
     */
    function arg_sort($array) {
        ksort($array);
        reset($array);
        return $array;
    }

    /********************************************************************************/

    /**签名字符串
      *$prestr 需要签名的字符串
      *return 签名结果
     */
    function sign($prestr,$sign_type) {
        $sign='';
        if($sign_type == 'MD5') {
            $sign = md5($prestr);
        }elseif($sign_type =='DSA') {
            //DSA 签名方法待后续开发
            die("DSA 签名方法待后续开发，请先使用MD5签名方式");
        }else {
            die("支付宝暂不支持".$sign_type."类型的签名方式");
        }
        return $sign;
    }
}